public class Main {
//    public static void main(String[] args) {
//
//        //System.out.println("Hello world!");
////        boolean flg1 = is_LeapYear(2004);
////        int a = 10;
////        int b = 20;
////
///*        int ret = fac(5);
//        System.out.println(fac(5));
//        System.out.println(fac(4));
//        System.out.println(fac(6));*/
//
//        //这个不是我敲的n，编译器自己加的。
//        //System.out.println(facSum(5));
////        int a =10;
////        int b= 20;
////        System.out.println(a+" "+b);
////        swap(a,b);
////        System.out.println(a+" "+b);
//    }
public static void main(String[] args){
    int a=10;
    int b=20;
    double x=20.7;
    double y =30.8;
    System.out.println(add(a,b));
    System.out.println(add(x,y));

    //被发好人卡——脸皮厚点，多尝试
    //喜欢一个人要勇敢——我有一个朋友，现在他们已经结婚了，
    //第一次被拒绝了，但我还要粘腻你，
    //两个人本来就很有趣——一个骂一个不要脸，一个说，我就不要脸

    //一个词语有多个含义，

    //现在很多名词都比较夸张，——舔狗——卷王
    //你记住，你是有目标的，达成你的目的就好了，别在意，你在意了，就是随大流了
    //两个人在一起是为了互相成长，
    //最好的谈恋爱方式是两个人都很忙
    //一个人很忙
    //另一个人很闲，说对方不和我聊天
    //忙的人，放下了自己的时间，最后肯定面临很多，
    //要为了共同的未来努力。
    //不能是一个人把另一个拉下来
    //这样才不会毕业季分手
    //目标：毕业之后，能够在对方的城市去建立自己的一个小家
    //两个人要为毕业后努力-定一个小目标，——1.58
    //
    //时间是宝贵的，
    //长大后的恋爱：你已经没有那么多时间去认识一个人，衡量对方的标准也早已经和学生时期不一样了。
    //大学三件事：学好，完好，认真恋爱。

    //方法签名，

}

//递归分为
    //递——你是怎么递下去的——一直递到临界条件处——开辟栈帧
       // 归，从临界条件的另一条语句，不断归回了——归还栈帧
public static int funFac(int n){
    if(n==1){
        return 1;//此处是递归的出口，如果没有出口，会无休止的创建，最后就崩掉了。
        //StackOverFlowError_栈溢出错误，一定是条件没有找对，导致了栈溢出
        //针对不同的题目，你要用不同的方式去做
        //
    }else{
        //递归其实是打断施法，执行了一半，突然发现子问题，又去解决子问题，不断地找子问题，最里层的子问题被解决后，
        //逐层向外的子问题也将被解决，最终，大的问题解决
        //fac（3）     |
        //fac（2）     |
        //fac（1）————>|
//      int tmp = n * funFac(n-1);
//      return tmp;
        //两种写法是一摸一样的
        return n * funFac(n-1);
    }
}
//回去把函数栈帧看一看，我得尝试尝试再次理解


//方法的递归
  //难处在于找递归公式————不是说讲了就会
  //只能是知道原理
  //只对不同的
  //原问题化为子问题——其实也就是求递归公式


  //

//方法名相同
    //参数列表是不同的——类型和参数——个数——顺序
    //返回值不影响重载

    //每一个方法都有签名的-唯一识别的——如果签名一样，就不让你存在。
    public static double add(double a,double b){
    return a+b;
    }
    public static int add(int a,int b){
    return a+b;
    }
//方法重载---
    //没有返回值的方法不用接受，不然会报错

    //没有返回值也不能和打印快捷键配合使用，没有返回值，你打印个啥子嘛。

    //形参只是拿到了实参的值，你在写交换函数的时候，就不行——swap函数，就可以验证
    //实参的值，赋值给形参-这样理解就好
    //我在main方法中写交换，目的是可以达成的
    //但我自己写的则不行——因为经过了一个传参的过程

    //实际上x和y的值确实交换了，但是你传进来的实参并没有交换。
    //因为形参是另外的空间，

    //java是不能对栈区取地址的，因为java很安全——不允许，
    //根本拿不到地址，

    //数组里面，牵扯到另外的东西，引用
    //引用变量！！！
    //这个变量不一样-他的里面存放的是地址
    //

    //数组其实就是一个引用——数组名就是一个引用。


    public static void swap(int x,int y){
        int tmp = x;
        x = y;
        y = tmp;
    }

    //这个java和C语言编译不一样
    //java是全局编译的，所以不需要，在使用之前声名
    //但C语言必须要声名，使用前要直到它存在——因为从上到下编译

    public static int facSum(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += fac(i);
        }
        return sum;
    }
    //方法区：编译之后，方法存放的位置
    //这个和JVM有关——看深入了解JVM

    //求阶乘
    public static int fac(int n) {
        int ret=1;
        for (int i = 0; i <= n; i++) {
            ret *= i;
        }
        return ret;
    }

    //判断是不是闰年
    public static boolean is_LeapYear(int year) {
        if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
            return true;
        }
        return false;
    }


}
